﻿#pragma once
#include <iostream>
using namespace std; 
//inline int addCount(int& a, int& b); // 要是敢在这里 定义 inline函数 ，展开后就直接找不到。
//初识类
class Student
{
public:
    void PrintInformation();
public:
   const char * _name;
   const char * _gender;
    int _age;
    long long _ident;
};

2024年4月初入cpp,学习面向对象的基本思想，学习cpp最基本的语法

//class Data
//{
//public:
//    // 这是辅助函数。
//    int GetMonthDay(int year, int month)
//    {
//        int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
//        {
//            days[2] = 29;
//        }
//        return days[month];
//    }
//
//    //定义构造函数（全缺省）//全缺省为默认的日期 // 构造函数无
//    Data(int year = 2024, int month = 4, int day = 21) //这里要确保day的合法性
//    {
//        if (month <= 12 && day <= GetMonthDay(year, month))
//        {
//            _year = year;
//            _month = month;
//            _day = day;
//        }
//        else
//        {
//            cout << "非法日期:" << year << "-" << month << "-" << day << endl;
//        }
//    }
//    //const Data d 引发函数无限递归调用。
//    Data(const Data& d) //这样才是对的
//    {
//        _year = d._year;
//        _month = d._month;
//        _day = d._day;
//    }
//    bool operator==(const Data& d)  //这里其实有两个参数，不要忘记 this指针。//不要引起无限递归。
//    {
//        return _year == d._year && _month == d._month && _day == d._day;
//    }
//    bool operator >(const Data& d)  //实际上把这两个实现一下就可以了
//    {
//        if (_year > d._year)
//            return true;
//        else if (_year == d._year && _month > d._month)
//            return true;
//        else if (_month == d._month && _day > d._day)
//            return true;
//        return false;
//    }
//    //复用：
//    bool operator>=(const Data& d)
//    {
//        // 这里 的 > 和 = 调用了上面的函数，所有这里就形成了复用。
//        return *this > d && *this == d;
//    }
//    bool operator<(const Data& d)
//    {
//        return  !(*this >= d);
//    }
//    bool operator<=(const Data& d)
//    {
//        return  *this < d || *this == d;
//    }
//    bool operator!=(const Data& d)
//    {
//        return !(*this == d);
//    }
//    //这是不会自己调用的，这里的Data是做返回值而不是函数名
//    Data operator+(int day)
//    {
//        Data newclass(*this);
//       // newclass._day += day;
//        newclass += day;  //这样子去写，也会直接复用+=，太六了。666
//        //while (newclass._day > getmonthday( newclass._year,newclass. _month) )
//        //{
//        //    newclass._day -= getmonthday(newclass._year,newclass._month);
//        //    newclass._month++;
//        //    if (newclass._month == 13)
//        //    {
//        //        newclass._year++;
//        //        newclass._month = 1;
//        //    }
//        //}
//        //// 若不返回 this 则 外面要用 指针接收就麻烦了
//        return newclass;
//    }
//    //返回自己。
//    Data& operator+=(int day)
//    {
//        _day += day;
//        while (_day > GetMonthDay(_year,_month))
//        {
//           _day -= GetMonthDay(_year, _month);
//           _month++;
//            if (_month == 13)
//            {
//                _year++;
//                _month = 1;
//            }
//        }
//        // 若不返回 this 则 外面要用 指针接收就麻烦了
//        return *this;
//    }
//    //写一个辅助函数搞事情。
//    int AddDay(const Data& d)const
//    {  
//        int total = 0;
//        total += d._day;
//        int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//        int month = d._month;
//        int year = d._year-1; //因为year，year也是从下一年开始，第一年已经算完了。
//        while (month >=  1)
//        {
//            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
//            {
//                days[2] = 29;
//            }
//            total += days[month-1]; // 因为day，这个月的已经加了，所以我们从下一个月开始。
//            month--;
//        }
//        while (year >= 0)
//        {
//            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
//            {
//                total += 366;
//            }
//            else
//            {
//                total += 365;
//            }
//            year--;
//        }
//        return total;
//    }
//    //航哥是用的加法实现，先判断谁大谁小，然后一直加到等于太六了，一直加到相等不久可以了，时间复杂度都是O（1）；
//    //int operator-(const Data& d)const // const *this
//    //{
//    //    return AddDay(*this) - AddDay(d); 
//    //}
//    // 航哥是用加法实现的: 小的日期一直加加加，最后与大日期相等
//    int operator-(const Data& d)const
//    {
//        int goal = -1;
//        Data min = *this;
//        Data max = d;   // 默认max是第二个参数，所以我们
//        if (min > max)
//        {
//            min = d;
//            max = *this;
//            goal = 1;
//        }
//        int total = 0;
//        while (min != max)
//        {
//            ++min;
//            total++;
//        }
//        return total*goal;
//    }
//
//    //日期减天数
//    Data operator-(int day)
//    {
//        Data cur = *this; //this不能变，我们要用替罪羊去搞事情。
//        while (cur._day - day < 1)  // 说明要从月上借位月
//        {
//            cur._day += GetMonthDay(cur._year, cur._month-1); //你要借的是上个月的 当month == 0上个月的就是零
//            if (cur._month == 1)
//            {
//                cur._year--;
//                cur._month = 13;  // 要从 12 月借 就 要month == 13 // 为啥不怕 month最后等于零
//            }
//            else
//            {
//                cur._month--;
//            }
//        }
//        // 这时已经一定减的了
//        cur._day -= day;
//        return cur;
//    }
//    //这时反面教材，说了this指针是隐藏的可以不写出来。
//    //Data& operator-=(int day)
//    //{
//    //    while ((*this)._day - day < 1)
//    //    {
//    //        (*this)._day += GetMonthDay( (*this)._year, (*this)._month -1); //你要借的是上个月的
//    //        if ((*this)._month == 1)
//    //        {
//    //            (*this)._year--;
//    //            (*this)._month = 13;  // 要从 12 月借 就 要month == 13
//    //        }
//    //        else
//    //        {
//    //            (*this)._month--;
//    //        }
//    //    }
//    //    (*this)._day -= day;
//    //    return *this;
//    //}
//    Data& operator-=(int day)
//    {
//        while (_day - day < 1)
//        {
//           _day += GetMonthDay(_year, _month - 1); //你要借的是上个月的
//            if (_month == 1)
//            {
//                _year--;
//               _month = 13;  // 要从 12 月借 就 要month == 13
//            }
//            else
//            {
//                _month--;
//            }
//        }
//        _day -= day;
//        return *this;
//    }
//   
//    Data& operator=(const Data& d)
//    {
//        if (*this != d) // 这个不等于也是上面实现的，因为这是自定义类型的不等于
//        {
//            _year = d._year;
//            _month = d._month;
//            _day = d._day;
//        }
//        return *this;
//    }
//    Data& operator++()
//    {
//        _day++;
//        return *this;
//    }
//
//    Data operator++(int)
//    {
//        Data cur = *this;
//        _day++;
//        if (_day > GetMonthDay(_year, _month))
//        {
//            _day = 1;
//            _month++;
//            if (_month == 13)
//            {
//                _month = 1;
//                _year++;
//            }
//        }
//        return cur;
//    }
//
//    Data& operator--()  // 通过函数实现抽象过程。
//    {
//        _day-=1;
//        return *this;
//    }
//
//    Data operator--(int)
//    {
//        Data cur = *this;
//        _day--;
//        if (_day == 0)
//        {
//            _day += GetMonthDay(_year, _month);
//            _month--;
//            if (_month == 0)
//            {
//                _month = 12;
//                _year--;
//            }
//        }
//        return cur;
//    }
//
//    void PrintData( );
//private:
//    int _year;
//    int _month;
//    int _day;
//};

//
//
//// 实现多文件操作的日期类
//
//class Data
//{
//public:
//    
//    int GetMonthDay(int year, int month)const;
//
//    Data(int year = 2024, int month = 4, int day = 21); 
//
//    Data(const Data& d); 
//
//    // operator函数写到内外面 就不能享受 this 指针 ，还会被 private 限制
//    bool operator==(const Data& d)const 
//    {
//        return _year == d._year && _month == d._month && _day == d._day;
//    }
//
//    bool operator >(const Data& d)const  //实际上把这两个实现一下就可以了
//    {
//        if (_year > d._year)
//            return true;
//        else if (_year == d._year && _month > d._month)
//            return true;
//        else if (_month == d._month && _day > d._day)
//            return true;
//        return false;
//    }
//
//    bool operator>=(const Data& d)const
//    {
//        return *this > d && *this == d;
//    }
//
//    bool operator<(const Data& d)const
//    {
//        return  !(*this >= d);
//    }
//    bool operator<=(const Data& d)const
//    {
//        return  *this < d || *this == d;
//    }
//    bool operator!=(const Data& d)const
//    {
//        return !(*this == d);
//    }
//    //这是不会自己调用的，这里的Data是做返回值而不是函数名
//    Data operator+(int day)const
//    {
//        Data newclass(*this);
//        newclass += day;  //这样子去写，也会直接复用+=，太六了。666
//        return newclass;
//    }
//    //返回自己。
//    Data& operator+=(int day)
//    {
//        _day += day;
//        while (_day > GetMonthDay(_year, _month))
//        {
//            _day -= GetMonthDay(_year, _month);
//            _month++;
//            if (_month == 13)
//            {
//                _year++;
//                _month = 1;
//            }
//        }
//        // 若不返回 this 则 外面要用 指针接收就麻烦了
//        return *this;
//    }
//    //写一个辅助函数搞事情。
//    int AddDay(const Data& d)const;
//    
//    int operator-(const Data& d)const
//    {
//        int goal = -1;
//        Data min = *this;
//        Data max = d;   // 默认max是第二个参数，所以我们
//        if (min > max)
//        {
//            min = d;
//            max = *this;
//            goal = 1;
//        }
//        int total = 0;
//        while (min != max)
//        {
//            ++min;
//            total++;
//        }
//        return total * goal;
//    }
//
//    //日期减天数
//    Data operator-(int day)const
//    {
//        Data cur = *this; //this不能变，我们要用替罪羊去搞事情。
//        while (cur._day - day < 1)  // 说明要从月上借位月
//        {
//            cur._day += GetMonthDay(cur._year, cur._month - 1); //你要借的是上个月的 当month == 0上个月的就是零
//            if (cur._month == 1)
//            {
//                cur._year--;
//                cur._month = 13;  // 要从 12 月借 就 要month == 13 // 为啥不怕 month最后等于零
//            }
//            else
//            {
//                cur._month--;
//            }
//        }
//        // 这时已经一定减的了
//        cur._day -= day;
//        return cur;
//    }
//    
//    Data& operator-=(int day)
//    {
//        while (_day - day < 1)
//        {
//            _day += GetMonthDay(_year, _month - 1); //你要借的是上个月的
//            if (_month == 1)
//            {
//                _year--;
//                _month = 13;  // 要从 12 月借 就 要month == 13
//            }
//            else
//            {
//                _month--;
//            }
//        }
//        _day -= day;
//        return *this;
//    }
//
//    Data& operator=(const Data& d)
//    {
//        if (*this != d) // 这个不等于也是上面实现的，因为这是自定义类型的不等于
//        {
//            _year = d._year;
//            _month = d._month;
//            _day = d._day;
//        }
//        return *this;
//    }
//
//    Data& operator++()
//    {
//        _day+=1;
//        return *this;
//    }
//
//    Data operator++(int)
//    {
//        Data cur = *this;
//        _day+=1;
//        return cur;
//    }
//
//    Data& operator--()  // 通过函数实现抽象过程。
//    {
//        _day -= 1;
//        return *this;
//    }
//
//    Data operator--(int)
//    {
//        Data cur = *this;
//        _day--;
//        if (_day == 0)
//        {
//            _day += GetMonthDay(_year, _month);
//            _month--;
//            if (_month == 0)
//            {
//                _month = 12;
//                _year--;
//            }
//        }
//        return cur;
//    }
//
//    void PrintData();
//private:
//    int _year;
//    int _month;
//    int _day;
//};
